package com.mass.core.framework.exception;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.apache.http.conn.ConnectTimeoutException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.mass.core.utils.AjaxResponse;

@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    /**
     * 系统异常处理，比如：404,500
     * @param req
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public AjaxResponse defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
    	e.printStackTrace();
    	if(e instanceof ConnectTimeoutException){//请求超时
    		return AjaxResponse.error("系统内部请求超时！");
    	}else if(e instanceof NullPointerException){//空指针
    		return AjaxResponse.error("空指针异常！"); 
    	}else if(e instanceof ClassCastException){//类型强转
    		return AjaxResponse.error("类型强转！"); 
    	}else if(e instanceof ArrayIndexOutOfBoundsException){//数组下标越界异常
    		return AjaxResponse.error("数组下标越界！"); 
    	}else if(e instanceof FileNotFoundException){//未找到文件
    		return AjaxResponse.error("未找到文件！"); 
    	}else if(e instanceof NumberFormatException){//字符串转换为数字异常
    		return AjaxResponse.error("字符串转换为数字异常！"); 
    	}else if(e instanceof SQLException){//操作数据库异常
    		return AjaxResponse.error("操作数据库异常！"); 
    	}else if(e instanceof IOException){//输入输出异常
    		return AjaxResponse.error("输入输出异常！"); 
    	}else if(e instanceof NoSuchMethodException){//方法未找到异常
    		return AjaxResponse.error("方法未找到！"); 
    	}else if(e instanceof ArithmeticException){//算术条件异常。譬如：整数除零等。
    		return AjaxResponse.error("整数除零！"); 
    	}else if(e instanceof ArrayIndexOutOfBoundsException){//数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    		return AjaxResponse.error("数组索引越界！"); 
    	}else if(e instanceof ArrayStoreException){//数组存储异常。当向数组中存放非数组声明类型对象时抛出。
    		return AjaxResponse.error("数组存储异常！"); 
    	}else if(e instanceof ClassCastException){//类造型异常。假设有类A和B（A不是B的父类或子类），O是A的实例，那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
    		return AjaxResponse.error("类造型异常！"); 
    	}else if(e instanceof ClassNotFoundException){//找不到类异常。当应用试图根据字符串形式的类名构造类，而在遍历CLASSPAH之后找不到对应名称的class文件时，抛出该异常。
    		return AjaxResponse.error("找不到类！"); 
    	}else if(e instanceof CloneNotSupportedException){//不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
    		return AjaxResponse.error("不支持克隆！"); 
    	}else if(e instanceof EnumConstantNotPresentException){//枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象，但该枚举对象并不包含常量时，抛出该异常。
    		return AjaxResponse.error("枚举常量不存在！"); 
    	}else if(e instanceof IllegalAccessException){//违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法，而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。
    		return AjaxResponse.error("违法的访问！"); 
    	}else if(e instanceof ArrayIndexOutOfBoundsException){//数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    		return AjaxResponse.error("数组索引越界！"); 
    	}else if(e instanceof InterruptedException){//被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态，而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
    		return AjaxResponse.error("被中止异常！"); 
    	}
        logger.error("", e);
        return AjaxResponse.error(e.getMessage());
    }
}